package org.example.domain.plugin.service;

import org.example.types.model.PluginSearchResult;
import org.example.types.model.SearchContext;
import reactor.core.publisher.Mono;

import java.time.Duration;
import java.util.Map;

/**
 * 异步搜索插件接口
 */
public interface AsyncSearchPlugin {

    /**
     * 插件名称
     */
    String getName();

    /**
     * 插件优先级（数字越小优先级越高）
     */
    default int getPriority() {
        return 3;
    }

    /**
     * 是否跳过Service层的关键词过滤
     */
    default boolean skipServiceFilter() {
        return false;
    }

    /**
     * 获取插件处理超时时间
     */
    default Duration getProcessingTimeout() {
        return Duration.ofSeconds(30);
    }

    /**
     * 获取插件响应超时时间
     */
    default Duration getResponseTimeout() {
        return Duration.ofSeconds(4);
    }

    /**
     * 异步搜索方法
     *
     * @param keyword 搜索关键词
     * @param context 搜索上下文
     * @param ext     扩展参数
     * @return 搜索结果
     */
    Mono<PluginSearchResult> asyncSearch(String keyword, SearchContext context, Map<String, Object> ext);

    /**
     * 插件是否可用
     */
    default boolean isAvailable() {
        return true;
    }

    /**
     * 插件描述
     */
    default String getDescription() {
        return getName() + " 搜索插件";
    }
}